package Leetcode.数组字符串;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ClassName 相等行列对
 * @since: 2023/8/14 11:23
 * @auth: kirito
 * @description:
 * 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ，
 * 返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。
 *
 * 如果行和列以相同的顺序包含相同的元素（即相等的数组），则认为二者是相等的。
 **/
public class 相等行列对 {
//    按照题目要求，对任意一行，将它与每一列都进行比较，如果相等，则对结果加一，最后返回总数。
public int equalPairs(int[][] grid) {
    int res = 0, n = grid.length;
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            if (equal(row, col, n, grid)) {
                res++;
            }
        }
    }
    return res;
}
    //比较行列值是否都相等
    public boolean equal(int row, int col, int n, int[][] grid) {
        for (int i = 0; i < n; i++) {
            if (grid[row][i] != grid[i][col]) {
                return false;
            }
        }
        return true;
    }

    /**
     * 首先将矩阵的行放入哈希表中统计次数，哈希表的键可以是将行拼接后的字符串，
     * 也可以用各语言内置的数据结构，然后分别统计每一列相等的行有多少，求和即可。
     *
     * 计算二维数组中的“相等对数目”。
     * 二维数组中的“相等对”是指由同一行或同一列的元素组成的两个数组，这两个数组在元素值上完全相等。
     *
     * @param grid 给定的二维数组
     * @return 二维数组中“相等对”的数目
     */
    public int equalPairs2(int[][] grid) {
        int n = grid.length;
        Map<List<Integer>, Integer> cnt = new HashMap<List<Integer>, Integer>();

        // 统计每行的数组，将其作为 List<Integer> 对象保存在哈希映射中
        for (int[] row : grid) {
            List<Integer> arr = new ArrayList<Integer>();
            for (int num : row) {
                arr.add(num);
            }
            cnt.put(arr, cnt.getOrDefault(arr, 0) + 1);
        }

        int res = 0;

        // 对每一列的数组进行处理，检查是否存在相等的数组
        for (int j = 0; j < n; j++) {
            List<Integer> arr = new ArrayList<Integer>();
            for (int i = 0; i < n; i++) {
                arr.add(grid[i][j]);
            }
            if (cnt.containsKey(arr)) {
                res += cnt.get(arr); // 更新相等对数目
            }
        }

        return res; // 返回“相等对”的数目
    }



}
